<!DOCTYPE HTML>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=677638
-->
<head>
  <meta charset="utf-8">
  <title>MessagePort/Channel any content</title>
  <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
  <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=677638">Mozilla Bug 677638</a>
<div id="content"></div>
<pre id="test">
</pre>
  <script type="application/javascript">

var tests = [
 'hello world',
 123,
 null,
 true,
 new Date(),
 [ 1, 'test', true, new Date() ],
 { a: true, b:  null, c: new Date(), d: [ true, false, {} ] },
 new Blob([123], { type: 'plain/text' })
];

var currentTest = null;

function getType(a) {
  if (a === null || a === undefined)
    return 'null';

  if (Array.isArray(a))
    return 'array';

  if (typeof a == 'object')
    return 'object';

  return 'primitive';
}

function compare(a, b) {
  is (getType(a), getType(b), 'Type matches');

  var type = getType(a);
  if (type == 'array') {
    is (a.length, b.length, 'Array.length matches');
    for (var i = 0; i < a.length; ++i) {
      compare(a[i], b[i]);
    }

    return;
  }

  if (type == 'object') {
    ok (a !== b, 'They should not match');

    var aProps = [];
    for (var p in a) aProps.push(p);

    var bProps = [];
    for (var p in b) bProps.push(p);

    is (aProps.length, bProps.length, 'Props match');
    is (aProps.sort().toSource(), bProps.sort().toSource(), 'Props match - using toSource()');

    for (var p in a) {
      compare(a[p], b[p]);
    }

    return;
  }

  if (type != 'null') {
    is (a.toSource(), b.toSource(), 'Matching using toSource()');
  }
}

function runTest() {
  var mc = new MessageChannel('foobar');
  ok(mc, "MessageChannel can be created");

  mc.port1.onmessage = function(event) {
    compare(event.data, currentTest);
    next();
  }

  function next() {
    if (!tests.length) {
      SimpleTest.finish();
      return;
    }

    currentTest = tests.shift();
    mc.port1.postMessage(currentTest);
  }

  var worker = new Worker("worker_messageChannel_any.js");
  worker.onmessage = function(event) {
    if (event.data == "READY") {
      next();
    }
  };

  worker.postMessage(mc.port2, [mc.port2]);
}

SimpleTest.waitForExplicitFinish();
runTest();
  </script>
</body>
</html>
